/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package filtros;

import bean.CertificadoBean;
import bean.FotoBean;
import bean.LogueoBean;
import bean.ObraPublicaBean;
import bean.PagosBean;
import bean.ProgramacionBean;
import java.io.IOException;
import javax.faces.FactoryFinder;
import javax.faces.context.FacesContext;
import javax.faces.context.FacesContextFactory;
import javax.faces.lifecycle.Lifecycle;
import javax.faces.lifecycle.LifecycleFactory;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author Ing. Monica Merlo, Ing. Agustin  Fernandez
 */
public class FiltroSeguridadAdmin implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        String nombrePagina = req.getRequestURI();
        nombrePagina = nombrePagina.substring(nombrePagina.lastIndexOf("/") + 1);
        if (nombrePagina.endsWith(".jsp")) {
            boolean autenticado = this.verificarAutenticacion(this.getFacesContext(request, response));
            if (autenticado) {
                boolean autorizado = this.verificarAutorizacion(nombrePagina, this.getFacesContext(request, response));
                if (autorizado == false) {
                    res.sendRedirect(req.getContextPath() + "/faces/admin/obraPublica.jsp");
                    return;
                }
            } else {
                res.sendRedirect(req.getContextPath() + "/faces/logueo.jsp");
                return;
            }
        }
        chain.doFilter(request, response);
    }

    public void destroy() {
    }

    private Object getBean(FacesContext currentInstance, String nombreBean) {
        return currentInstance.getApplication().getELResolver().getValue(currentInstance.getELContext(), null, nombreBean);
    }

    private FacesContext getFacesContext(final ServletRequest request, final ServletResponse response) {

        FacesContext facesContext = FacesContext.getCurrentInstance();
        if (facesContext != null) {
            return facesContext;
        }

        // Si el facesContext es null se crea un Contexto por default

        FacesContextFactory contextFactory = (FacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);

        LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);

        Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
        ServletContext servletContext = ((HttpServletRequest) request).getSession().getServletContext();
        facesContext = contextFactory.getFacesContext(servletContext, request, response, lifecycle);

        return facesContext;
    }

    private boolean verificarAutenticacion(FacesContext contexto) {
        LogueoBean logueoBean = (LogueoBean) this.getBean(contexto, "LogueoBean");
        if (logueoBean.isAutenticado()) {
            return true;
        } else {
            return false;
        }
    }

    private boolean verificarAutorizacion(String nombrePagina, FacesContext contexto) {
        LogueoBean logueoBean = (LogueoBean) this.getBean(contexto, "LogueoBean");
        ObraPublicaBean obraBean = (ObraPublicaBean) this.getBean(contexto, "ObraPublicaBean");
        CertificadoBean certiBean = (CertificadoBean) this.getBean(contexto, "CertificadoBean");
        PagosBean pagoBean = (PagosBean) this.getBean(contexto, "PagosBean");
        FotoBean fotoBean = (FotoBean) this.getBean(contexto, "FotoBean");
        ProgramacionBean programacionBean = (ProgramacionBean) this.getBean(contexto, "ProgramacionBean");
        if (nombrePagina.contains("amObraPublica.jsp")) {
            if (logueoBean.isPermisoModObra() || logueoBean.isPermisoModFotos() || logueoBean.isPermisoModProgramaciones() || logueoBean.isPermisoModCertificado()) {
                if (obraBean.isAgregarObra() && obraBean.getId() == -1) {
                    return true;
                } else if (obraBean.isAgregarObra() == false && obraBean.getId() > 0) {
                    return true;
                } else if (fotoBean.getIdObra() > 0 || certiBean.getIdObra() > 0 || programacionBean.getIdObra() > 0) {
                        return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } else if (nombrePagina.contains("certificado.jsp")) {
            if (logueoBean.isPermisoModCertificado()) {
                if (certiBean.getIdObra() > 0) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } else if (nombrePagina.contains("contrato.jsp")) {
            if (logueoBean.isPermisoModContrato()) {
                return true;
            } else {
                return false;
            }
        } else if (nombrePagina.contains("empresaContratista.jsp")) {
            if (logueoBean.isPermisoModEmpresa()) {
                return true;
            } else {
                return false;
            }
        } else if (nombrePagina.contains("usuario.jsp") || nombrePagina.contains("tipoObra.jsp") || nombrePagina.contains("tipoConstruccion.jsp") || nombrePagina.contains("estadoObra.jsp") || nombrePagina.contains("programa.jsp")) {
            if (logueoBean.isPermisoAdministracion()) {
                return true;
            } else {
                return false;
            }
        } else if (nombrePagina.contains("pago.jsp")) {
            if (logueoBean.isPermisoModPago()) {
                if (pagoBean.getIdObra() > 0) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } else if (nombrePagina.contains("fotosObraPublica.jsp")) {
            if (logueoBean.isPermisoModFotos()) {
                if (fotoBean.getIdObra() > 0) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } else if (nombrePagina.contains("programacion.jsp")) {
            if (logueoBean.isPermisoModProgramaciones() || logueoBean.isPermisoSeguimientoProgramaciones()) {
                if (programacionBean.getIdObra() > 0) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } else if (nombrePagina.contentEquals("obraPublica.jsp") || nombrePagina.contentEquals("cambiarClave.jsp")) {
            return true;
        } else {
            return false;
        }
    }
}
